UT 4: Desarrollo de aplicaciones web con PHP

1. Cookies

Una cookie es una variable un sitio web guarda en el entorno del usuario del navegador (normalmente en un fichero de texto o una pequeña base de datos). Su uso más típico es el almacenamiento de las preferencias del usuario (por ejemplo, el idioma en que se deben mostrar las páginas), para que no tenga que volver a indicarlas la próxima vez que visite el sitio.

Recomendación

Las herramientas para desarrolladores de Mozilla Firefox o Google Chrome te permiten ver e incluso editar las Cookies.

El servidor, al responder una petición, indica al navegador que almacene cookies en la cabecera de la respuesta:

HTTP/2.0 200 OK Content-Type: text/html Set-Cookie: yummy_cookie=choco Set-Cookie: tasty_cookie=strawberry [cuerpo de la petición]

Una vez el navegador tiene las cookies, cada vez que hace una petición al servidor las incluye en la cabecera de la petición:

GET /sample_page.html HTTP/2.0 Host: www.example.org Cookie: yummy_cookie=choco; tasty_cookie=strawberry

En PHP, para almacenar una cookie en el navegador del usuario, puedes utilizar la función setcookie. El único parámetro obligatorio que tienes que usar es el nombre de la cookie, pero admite varios parámetros más opcionales.

Por ejemplo, si quieres almacenar en una cookie la IP desde la que nos visitó el usuario por última vez, puedes hacer:

setcookie("ultima_ip", $_SERVER['REMOTE_ADDR'], time()+3600);

Los dos primeros parámetros son el nombre de la cookie y su valor. El tercero es la fecha de caducidad de la misma (una hora desde el momento en que se ejecute). En caso de no figurar este parámetro, la cookie se eliminará cuando se cierre el navegador. Ten en cuenta que también se pueden aplicar restricciones a las páginas del sitio que pueden acceder a una cookie en función de la ruta.

El proceso de recuperación de la información que almacena una cookie es muy simple. Cuando accedes a un sitio web, el navegador le envía de forma automática todo el contenido de las cookies que almacene relativas a ese sitio en concreto. Desde PHP puedes acceder a esta información por medio del array $_COOKIE.

echo $_COOKIE['ultima_ip'];

Siempre que utilices cookies en una aplicación web, debes tener en cuenta que en última instancia su disponibilidad está controlada por el cliente. Por ejemplo, algunos usuarios deshabilitan las cookies en el navegador porque piensan que la información que almacenan puede suponer un potencial problema de seguridad. O la información que almacenan puede llegar a perderse porque el usuario decide formatear el equipo o simplemente eliminarlas de su sistema.

Recomendación

Si una vez almacenada una cookie en el navegador quieres eliminarla antes de que expire, puedes utilizar la misma función setcookie pero indicando una fecha de caducidad anterior a la actual.

Ejercicio 4.1

Crea una página en la que almacenes en una cookie el último instante en que el usuario visitó la página. Si es su primera visita, muestra un mensaje de bienvenida. En caso contrario, muestra la fecha y hora de su anterior visita.

2. Manejo de sesiones

Como acabas de ver, una forma para guardar información particular de cada usuario es utilizar cookies. Sin embargo, existen diversos problemas asociados a las cookies, como el número de ellas que admite el navegador, o su tamaño máximo. Para solventar estos inconvenientes, existen las sesiones. El término sesión hace referencia al conjunto de información relativa a un usuario concreto. Esta información puede ser tan simple como el nombre del propio usuario, o más compleja, como los artículos que ha depositado en la cesta de compra de una tienda online.

Cada usuario distinto de un sitio web tiene su propia información de sesión. Para distinguir una sesión de otra se usan los identificadores de sesión (SID). Un SID es un atributo que se asigna a cada uno de los visitantes de un sitio web y lo identifica. De esta forma, si el servidor web conoce el SID de un usuario, puede relacionarlo con toda la información que posee sobre él, que se mantiene en la sesión del usuario. Esa información se almacena en el servidor web, generalmente en ficheros aunque también se pueden utilizar otros mecanismos de almacenamiento como bases de datos.

Como ya habrás supuesto, la cuestión ahora es: ¿y dónde se almacena ese SID, el identificador de la sesión, que es único para cada usuario? Pues existen dos maneras de mantener el SID entre las páginas de un sitio web que visita el usuario:

Ninguna de las dos maneras es perfecta. Ya sabes los problemas que tiene la utilización de cookies. Pese a ello, es el mejor método y el más utilizado. Propagar el SID como parte de la URL conlleva mayores desventajas, como la imposibilidad de mantener el SID entre distintas sesiones, o el hecho de que compartir la URL con otra persona implica compartir también el identificador de sesión.

La buena noticia, es que el proceso de manejo de sesiones en PHP está automatizado en gran medida. Cuando un usuario visita un sitio web, no es necesario programar un procedimiento para ver si existe un SID previo y cargar los datos asociados con el mismo. Tampoco tienes que utilizar la función setcookie si quieres almacenar los SID en cookies, o ir pasando el SID entre las páginas web de tu sitio si te decides por propagarlo. Todo esto PHP lo hace automáticamente.

A la información que se almacena en la sesión de un usuario también se le conoce como cookies del lado del servidor (server side cookies). Debes tener en cuenta que aunque esta información no viaja entre el cliente y el servidor, sí lo hace el SID, bien como parte de la URL o en un encabezado HTTP si se guarda en una cookie. En ambos casos, esto plantea un posible problema de seguridad. El SID puede ser conseguido por otra persona, y a partir del mismo obtener la información de la sesión del usuario. La manera más segura de utilizar sesiones es almacenando los SID en cookies y utilizar HTTPS para encriptar la información que se transmite entre el servidor web y el cliente.

2.1. Configuración

Por defecto, PHP incluye soporte de sesiones incorporado. Sin embargo, antes de utilizar sesiones en tu sitio web, debes configurar correctamente PHP utilizando las siguientes directivas en el fichero php.ini según corresponda:

Directiva Significado
session.use_cookies Indica si se deben usar cookies (1) o propagación en la URL (0) para almacenar el SID.
session.use_only_cookies Se debe activar (1) cuando utilizas cookies para almacenar los SID, y además no quieres que se reconozcan los SID que se puedan pasar como parte de la URL (este método se puede usar para usurpar el identificador de otro usuario).
session.save_handler Se utiliza para indicar a PHP cómo debe almacenar los datos de la sesión del usuario. Existen cuatro opciones: en ficheros (files), en memoria (mm), en una base de datos SQLite (sqlite) o utilizando para ello funciones que debe definir el programador (user). El valor por defecto (files) funcionará sin problemas en la mayoría de los casos.
session.name Determina el nombre de la cookie que se utilizará para guardar el SID. Su valor por defecto es PHPSESSID.
session.auto_start Su valor por defecto es 0, y en este caso deberás usar la función session_start para gestionar el inicio de las sesiones. Si usas sesiones en el sitio web, puede ser buena idea cambiar su valor a 1 para que PHP active de forma automática el manejo de sesiones.
session.cookie_lifetime Si utilizas la URL para propagar el SID, éste se perderá cuando cierres tu navegador. Sin embargo, si utilizas cookies, el SID se mantendrá mientras no se destruya la cookie. En su valor por defecto (0), las cookies se destruyen cuando se cierra el navegador. Si quieres que se mantenga el SID durante más tiempo, debes indicar en esta directiva ese tiempo en segundos.
session.gc_maxlifetime Indica el tiempo en segundos que se debe mantener activa la sesión, aunque no haya ninguna actividad por parte del usuario. Su valor por defecto es 1440. Es decir, pasados 24 minutos desde la última actividad por parte del usuario, se cierra su sesión automáticamente.

La función phpinfo, de la que ya hablamos con anterioridad, te ofrece información sobre la configuración actual de las directivas de sesión.

Para saber más

En la documentación de PHP tienes información sobre éstas y otras directivas que permiten configurar el manejo de sesiones.

2.2. Inicio y fin de una sesión

El inicio de una sesión puede tener lugar de dos formas. Si has activado la directiva session.auto_start en la configuración de PHP, la sesión comenzará automáticamente en cuanto un usuario se conecte a tu sitio web. En caso de que ese usuario ya haya abierto una sesión con anterioridad, y esta no se haya eliminado, en lugar de abrir una nueva sesión se reanudará la anterior. Para ello se utilizará el SID anterior, que estará almacenado en una cookie (recuerda que si usas propagación del SID, no podrás restaurar sesiones anteriores; el SID figura en la URL y se pierde cuando cierras el navegador).

Si por el contrario, decides no utilizar el inicio automático de sesiones, deberás ejecutar la función session_start para indicar a PHP que inicie una nueva sesión o reanude la anterior. Aunque anteriormente esta función devolvía siempre true, a partir de la versión 5.3.0 de PHP su comportamiento es más coherente: devuelve false en caso de no poder iniciar o restaurar la sesión.

Como el inicio de sesión requiere utilizar cookies, y éstas se transmiten en los encabezados HTTP, debes tener en cuenta que para poder iniciar una sesión utilizando session_start, tendrás que hacer las llamadas a esta función antes de que la página web muestre información en el navegador.

Además, todas las páginas que necesiten utilizar la información almacenada en la sesión, deberán ejecutar la función session_start.

Mientras la sesión permanece abierta, puedes utilizar la variable superglobal $_SESSION para añadir información a la sesión del usuario, o para acceder a la información almacenada en la sesión. Por ejemplo, para contar el número de veces que el usuario visita la página, puedes hacer:

// Iniciamos la sesión o recuperamos la anterior sesión existente session_start(); // Comprobamos si la variable ya existe if (isset($_SESSION['visitas'])) $_SESSION['visitas']++; else $_SESSION['visitas'] = 0;

Si en lugar del número de visitas, quisieras almacenar el instante en que se produce cada una, la variable de sesión visitas deberá ser un array y por tanto tendrás que cambiar el código anterior por:

// Iniciamos la sesión o recuperamos la anterior sesión existente session_start(); // En cada visita añadimos un valor al array "visitas" $_SESSION['visitas'][] = date('d-m-Y H:i:s');

Aunque como ya viste, puedes configurar PHP para que elimine de forma automática los datos de una sesión pasado cierto tiempo, en ocasiones puede ser necesario cerrarla de forma manual en un momento determinado. Por ejemplo, si utilizas sesiones para recordar la información de autentificación, deberás darle al usuario del sitio web la posibilidad de cerrar la sesión cuando lo crea conveniente.

En PHP tienes dos funciones para eliminar la información almacenada en la sesión:

¡Atención!

Aunque se use session_destroy, la sesión no se destruye hasta que termina la ejecución del programa, de forma que las variables de sesión estarán disponibles durante el resto de la ejecución del script.

Ejercicio 4.2

Crea una página similar a la anterior, almacenando en la sesión de usuario los instantes de todas sus últimas visitas. Si es su primera visita, muestra un mensaje de bienvenida. En caso contrario, muestra una lista de la fecha y hora de todas sus visitas anteriores. Añade un botón a la página que permita borrar el registro de visitas.

3. Autenticación de usuarios y control de acceso

Muchas veces es importante verificar la identidad de los dos extremos de una comunicación. En el caso de una comunicación web, existen métodos para identificar tanto al servidor en el que se aloja el sitio web, como al usuario del navegador que se encuentra en el otro extremo.

Los sitios web que necesitan emplear identificación del servidor, como las tiendas o los bancos, utilizan el protocolo HTTPS. Este protocolo requiere de un certificado válido, firmado por una autoridad confiable, que es verificado por el navegador cuando se accede al sitio web. Además, HTTPS utiliza métodos de cifrado para crear un canal seguro entre el navegador y el servidor, de tal forma que no se pueda interceptar la información que se transmite por el mismo.

Para identificar a los usuarios que visitan un sitio web, se pueden utilizar distintos métodos como el DNI digital o certificados digitales de usuario, pero el más extendido es solicitar al usuario cierta información que solo él conoce: la combinación de un nombre de usuario y una contraseña.

En la unidad anterior aprendiste a utilizar aplicaciones web para gestionar información almacenada en bases de datos. En la mayoría de los casos es importante implantar en este tipo de aplicaciones web, las que acceden a bases de datos, algún mecanismo de control de acceso que obligue al usuario a identificarse. Una vez identificado, se puede limitar el uso que puede hacer de la información.

Así, puede haber sitios web en los que los usuarios autentificados pueden utilizar sólo una parte de la información (como los bancos, que permiten a sus clientes acceder únicamente a la información relativa a sus cuentas). Otros sitios web necesitan separar en grupos a los usuarios autentificados, de tal forma que la información a la que accede un usuario depende del grupo en que éste se encuentre. Por ejemplo, una aplicación de gestión de una empresa puede tener un grupo de usuarios a los que permite visualizar la información, y otro grupo de usuarios que, además de visualizar la información, también la pueden modificar.

Atención

Debes distinguir la autentificación de los usuarios y el control de acceso, de la utilización de mecanismos para asegurar las comunicaciones entre el usuario del navegador y el servidor web. Aunque ambos aspectos suelen ir unidos, son independientes.

En los ejemplos de esta unidad, la información de autentificación (nombre y contraseña de los usuarios) se envía en texto plano desde el navegador hasta el servidor web. Esta práctica es altamente insegura y nunca debe usarse sin un protocolo como HTTPS que permita cifrar las comunicaciones con el servidor web. Sin embargo, la configuración de servidores web que permitan usar el protocolo HTTPS para cifrar la información que reciben y transmiten no forma parte de los contenidos de este módulo. Por este motivo, durante esta unidad utilizaremos únicamente el protocolo no seguro HTTP.

3.1. Mecanismos de autenticación

3.1.1. Protocolo HTTP

El protocolo HTTP ofrece un método sencillo para autentificar a los usuarios. El proceso es el siguiente:

En el servidor web Apache, existe una utilidad en línea de comandos, htpasswd , que permite almacenar en un fichero una lista de usuarios y sus respectivas contraseñas. La información relativa a las contraseñas se almacena cifrada; aun así, es conveniente crear este fichero en un lugar no accesible por los usuarios del servidor web.

Por ejemplo, para crear el fichero de usuario y añadirle el usuario dwes haremos los siguiente:

sudo htpasswd -c users dwes

La opción -c indica que se debe crear el fichero, por lo que solo deberás usarla cuando introduzcas el primer usuario y contraseña. Fíjate que en el ejemplo anterior, el fichero se crea en la ruta /etc/apache2/users. En principio este fichero no es accesible vía web.

Si la consola indica que no encuentra el comando htpasswd puede deberse a que no esté instalado el paquete de utilidades de Apache, para ello sólo hay que ejecutar:

sudo apt-get install apache2-utils

Para indicarle al servidor Apache qué recursos tienen acceso restringido, una opción es crear un fichero .htaccess en el directorio en que se encuentren, con las siguientes directivas:

AuthName "Contenido restringido" AuthType Basic AuthUserFile /etc/apache2/users require valid-user

El significado de cada una de las directivas anteriores es el siguiente:

Directiva Significado
AuthName Nombre de dominio que se usará en la autentificación. Si el cliente se autentifica correctamente, esa misma información de autentificación se utilizará automáticamente en el resto de las páginas del mismo dominio
AuthType Método de autentificación que se usará. Además del método Basic, Apache también permite utilizar el método Digest
AuthUserFile Ruta al archivo de credenciales que has creado con htpasswd
Require Permite indicar que sólo puedan acceder algunos usuarios o grupos de usuarios concretos. Si indicamos valid-user, podrán acceder todos los usuarios que se autentifiquen correctamente

Además tendrás que asegurarte de que en la configuración de Apache se utiliza la directiva AllowOverride para que se aplique correctamente la configuración que figura en los ficheros .htaccess.

Hay una creencia errónea de que necesita usar ficheros .htaccess para configurar autenticación con contraseña. Este no es el caso. Colocar las directivas de autenticación en una sección <Directory>, en su fichero de configuración principal, es el método recomendado para configurar esto, y los ficheros .htaccess deberían usarse solamente si no tiene acceso al fichero de configuración principal del servidor.

Más información

Cuando (no) usar ficheros .htaccess

Desde PHP puedes acceder a la información de autentificación HTTP que ha introducido el usuario utilizando el array superglobal $_SERVER.

Valor Contenido
$_SERVER['PHP_AUTH_USER'] Nombre de usuario que se ha introducido.
$_SERVER['PHP_AUTH_PW'] Contraseña introducida
$_SERVER['AUTH_TYPE'] Método HTTP usado para autentificar. Puede ser Basic o Digest.

Es decir, que si creas una página web que muestre los valores de estas variables, y preparas el servidor web para utilizar autentificación HTTP, cuando accedas a esa página con el usuario dwes obtendrás algo como lo siguiente:

<!DOCTYPE html> <!-- Desarrollo Web en Entorno Servidor --> <!-- Tema 4 : Desarrollo de aplicaciones web con PHP --> <!-- Ejemplo: Autentificación HTTP --> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Ejemplo Tema 4: Autenticación HTTP</title> </head> <body> <?php if (isset($_SERVER['PHP_AUTH_USER']) and isset($_SERVER['PHP_AUTH_PW']) and isset($_SERVER['AUTH_TYPE'])) { echo "Nombre de usuario: ".$_SERVER['PHP_AUTH_USER']."<br />"; echo "Contraseña: ".$_SERVER['PHP_AUTH_PW']."<br />"; echo "Método de autentificación: ".$_SERVER['AUTH_TYPE']."<br />"; } else echo "No se ha autentificado"; ?> </body> </html>

Si no introduces un usuario/contraseña válidos, el navegador te mostrará el error 401.

Recuerda que debes tener creado el fichero .htaccess en la ubicación donde ejecutas este ejemplo, para que solicite la autentificación.

Además, en PHP puedes usar la función header para forzar a que el servidor envíe un error de "Acceso no autorizado" (código 401). De esta forma no es necesario utilizar ficheros .htaccess para indicarle a Apache qué recursos están restringidos. En su lugar, puedes añadir las siguientes líneas en tus páginas PHP:

if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic Realm="Contenido restringido"'); header('HTTP/1.0 401 Unauthorized'); echo "Usuario no reconocido!"; exit; }

Debes conocer

La función header envía encabezados HTTP, pero debe utilizarse antes de que se muestre nada por pantalla. En caso contrario, obtendrás un error.

Con el código anterior, la página envía un error 401, lo que fuerza al navegador a solicitar las credenciales de acceso (nombre de usuario y contraseña). Si se introducen, se ejecuta el resto de la página y se muestra su contenido. En este caso, habría que añadir algún código para comprobar que el nombre de usuario y contraseña son válidos, tal y como veremos a continuación. Si se pulsa el botón Cancelar, se muestra el mensaje de error que se indica.

3.1.2. Formulario web

Otra opción muy utilizada para permitir la autenticación independiente del protocolo HTTP es utilizar un formulario y variables de sesión. Para que el usuario se pueda autentificar, normalmente se suele crear una página con un formulario de login:

<form action="login.php" method="post"> <label for="uname"><b>Username</b></label> <input type="text" placeholder="Enter Username" name="uname" required> <label for="psw"><b>Password</b></label> <input type="password" placeholder="Enter Password" name="psw" required> <button type="submit">Login</button> </form>

En el procesamiento del usuario, si todo está correcto, se crea una variable de sesión que recoja datos de dicho usuario (por ejemplo el nombre de usuario):

$_SESSION['usuario'] = $_POST['uname'];

Si está sin definir, vacía o nula, se considera que el usuario no está "logueado".

if (!empty($_SESSION['usuario'])){ echo "Nombre de usuario: ".$_SESSION['usuario']."<br />"; } else { echo "No se ha autentificado"; }

Para crear zonas a las que sólo puedan acceder usuarios registrados únicamente habría que comprobar la variable de sesión. Podemos devolver un error...

if (empty($_SESSION['usuario'])) { header('HTTP/1.0 401 Unauthorized'); echo "Usuario no reconocido!"; exit; }

...o redirigir al usuario a la página de login.

if (empty($_SESSION['usuario'])) { header("Location:login.php"); exit; }

Para desautenticar a un usuario únicamente habremos de borrar la variable de sesión o asignarle un valor nulo:

unset($_SESSION['usuario']);
$_SESSION['usuario'] = null;

Aunque lo más recomendable es destruir la sesión completa:

session_destroy();

3.2 Incorporación de métodos de autentificación a una aplicación web

Si utilizas la función header para forzar al navegador a solicitar credenciales HTTP, el usuario introducirá un nombre y una contraseña. Pero el servidor no verificará esta información; deberás ser tú quien provea un método para comprobar que las credenciales que ha introducido el usuario son correctas.

El método más simple es incluir en el código PHP de tu página las sentencias necesarias para comparar los datos introducidos con otros datos fijos. Por ejemplo, para permitir el acceso a un usuario dwes con contraseña abc123, puedes hacer:

if ($_SERVER['PHP_AUTH_USER']!='dwes' || $_SERVER['PHP_AUTH_PW']!='abc123') { header('WWW-Authenticate: Basic Realm="Contenido restringido"'); header('HTTP/1.0 401 Unauthorized'); echo "Usuario no reconocido!"; exit; }

Recuerda que el código PHP no se envía al navegador, por lo que la información de autentificación que introduzcas en el código no será visible por el usuario. Sin embargo, esto hará tu código menos portable. Si necesitas modificar el nombre de usuario o la contraseña, tendrás que hacer modificaciones en el código. Además, no podrás permitir al usuario introducir su propia contraseña.

Una solución mejor es utilizar un almacenamiento externo para los nombres de usuario y sus contraseñas. Para esto podrías emplear un fichero de texto, o mejor aún, una base de datos. La información de autentificación podrá estar aislada en su propia base de datos, o compartir espacio de almacenamiento con los datos que utilice tu aplicación web.

Aunque se podrían almacenar las contraseñas en texto plano, es mejor hacerlo almacenando su hash. De esta manera si alguien robara las bases de datos no obtendría las contraseñas. Para comprobar si una contraseña es correcta, calculamos su hash y lo comparamos con el que se encuentra almacenado en la base de datos.

Para saber más

Con frecuencia no se calcula el hash de la clave directamente, sino que antes se le concatena una cadena de caracteres conocida como [sal](https://es.wikipedia.org/wiki/Sal_(criptografía))

En PHP puedes usar la función md5 para calcular el hash MD5 de una cadena de texto. No obstante, aunque suele usarse mucho, no es muy recomendable usarla para el encriptado de contraseñas. Se recomienda usar el API de contraseñas, el cual además genera la sal de manera aleatoria.

<?php $usuario = "lola25"; $nombre = "Lola Pérez"; $clave = password_hash("12341234", PASSWORD_DEFAULT); $bd->exec('INSERT INTO usuarios (user, password, name) VALUES ("' . $usuario . '", "' . $clave . '", "' . $nombre . '")');
$sql = "SELECT user, password FROM usuarios WHERE user = :username"; $consulta = $bd->prepare($sql); $consulta->execute(["username" => $_POST['usuario']]); $usuario = $consulta->fetch(); if (!empty($usuario) and password_verify($_POST['clave'], $usuario['password'])) { $_SESSION['usuario'] = $usuario['user']; echo '<h1>Bienvenido</h1>'; } else { echo 'Usuario o clave incorrectos'; }

Ejercicio 4.3

Crea un formulario de inicio de sesión. Si la autenticación es correcta, la página debe mostrar un mensaje de bienvenida. En caso contrario, debe mostrar el formulario de inicio de sesión y un mensaje de error.

Los usuarios se deben almacenar en la base de datos, teniendo cuidado de no almacenar la contraseña en texto plano sino su hash. Se propone usar el siguiente código SQL:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; CREATE TABLE `usuarios` ( `id_usuario` int(10) UNSIGNED NOT NULL, `user` varchar(255) COLLATE utf8_bin NOT NULL UNIQUE, `password` varchar(255) COLLATE utf8_bin NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; ALTER TABLE `usuarios` ADD PRIMARY KEY (`id_usuario`); ALTER TABLE `usuarios` MODIFY `id_usuario` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

Prácticas

Práctica 1

Vamos a crear una página web sólo para usuarios. Esta web va a tener 3 páginas:

Previamente habrá que crear una tabla "usuarios" usando el código SQL adjunto y rellenarla con varios usuarios inventados. Para ello Utiliza un script PHP que simplemente cree usuarios y los guarde en la base de datos. No almacenes las contraseñas en texto plano, usa la API de contraseñas.

Consideraciones:

Código SQL

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; CREATE TABLE `usuarios` ( `id_usuario` int(10) UNSIGNED NOT NULL, `user` varchar(255) COLLATE utf8_bin NOT NULL UNIQUE, `password` varchar(255) COLLATE utf8_bin NOT NULL, `name` varchar(255) COLLATE utf8_bin NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; ALTER TABLE `usuarios` ADD PRIMARY KEY (`id_usuario`); ALTER TABLE `usuarios` MODIFY `id_usuario` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

Ejercicios de ampliación

Ampliación 1: Roles

Partiendo de la práctica 1, añade una columna en la base de datos llamada "rol" en las que unos sean usuarios y otros administradores.

Crea una página llamada zona_administración.php a la que sólo puedan acceder administradores en la que se muestre un listado de los usuarios, con su rol y su nombre real.

Si intenta acceder un usuario normal, se le muestra un mensaje que le informa de que esa página sólo está disponible para administradores.

Si intenta acceder alguien sin autenticar, se le debe redirigir a login.php.

Modifica zona_restringida.php para que, si el usuario es administrador, le aparezca un enlace a la zona de administración.

Ampliación 2: Formulario de registro

Partiendo de la práctica 1, añade una página llamada register.php en la que, mediante un formulario, se puedan crear usuarios.

Si la creación es correcta, se inicia sesión automáticamente y se manda al usuario a la zona restringida.

Si un usuario autenticado intenta acceder al formulario de registro, se le muestra un mensaje diciendo que el usuario ya tiene una sesión iniciada.